/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package src.tarea1;

import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author ginancm
 */
public class PruebaCorridas {
    
    private int numeroDatos;
    private List <Double> arrayDatos;
    private int corridas;
    private boolean [] arrayAsc;
    private double mediaTeorica;
    private double varianzaTeorica;
    private double zObservado;
    private double valorSignificancia;
    private double zSignificancia;
    
    public PruebaCorridas (List<Double> datos){
        numeroDatos=datos.size();
        this.arrayDatos=datos;
        mediaTeorica=0.0;
        varianzaTeorica=0.0;
        zObservado=0.0;
        valorSignificancia=0.05; // Valor alfa de significancia
        zSignificancia=1.96;  // Valor de Z para el alfa dado
        arrayAsc= new boolean[numeroDatos];
}
    public PruebaCorridas (List<Double> datos, double alfa){
        numeroDatos=datos.size();
        this.arrayDatos=datos;
        mediaTeorica=0.0;
        varianzaTeorica=0.0;
        zObservado=0.0;
        valorSignificancia=alfa; // Valor alfa de significancia
        //TODO:Mirar como calcular el valor crítico de la distribución normal con JAVA
        zSignificancia=1.96;  // Valor de Z para el alfa dado
        arrayAsc= new boolean[numeroDatos];
}
    public void calcularCorridas(){
//        double datoActual;
//        double datoProx;
//        int corridaTemp=0;
//            
//        for(int i=1; i<arrayDatos.size(); i++){
//            datoProx=arrayDatos.get(i);
//            datoActual=arrayDatos.get(i-1);
//            if(datoActual>datoProx)  
//            {
//                corridaTemp++;
//                if(datoActual < (datoActual+1)) corridaTemp++;
//            }
//        }
        
        /*Alternativa Jorge
         */
        int contadorCorridasAlt=0;
        int idPasado=0;
        boolean corridaAsc=(arrayDatos.get(idPasado)<
                arrayDatos.get(idPasado+1));
        arrayAsc[0]=corridaAsc;
        for(int i=1; i< arrayDatos.size(); i++){
            if(arrayDatos.get(i)>arrayDatos.get(idPasado)
                    && !corridaAsc) {
                contadorCorridasAlt++;
                corridaAsc=true;
            }else if (arrayDatos.get(i)<arrayDatos.get(idPasado) 
                    && corridaAsc){
                contadorCorridasAlt++;
                corridaAsc=false;
            }
            arrayAsc[i]=corridaAsc;
            idPasado=i;
        }
        contadorCorridasAlt++;
//        corridas=corridaTemp;
        corridas=contadorCorridasAlt;
        System.out.println("Numero de corridas: "+corridas);
    }
    
    public void imprimirArrayAsc(){
        System.out.println("Array de Corridas:");
        System.out.print(" * ");
        for (int i = 1; i < numeroDatos; i++) {
            if(arrayAsc[i]){
                System.out.print(" + ");
            } else{
                System.out.print(" - ");
            }
            Double dato= new Double((double)i/10.0);
        }
        System.out.println();
    }
    
    public boolean realizarPrueba(){
        calcularCorridas();
        
        mediaTeorica=(double)((2*numeroDatos)-1)/3.0;
        varianzaTeorica=(double)((16*numeroDatos)-29)/90.0;
        zObservado=(corridas-mediaTeorica)/Math.sqrt(varianzaTeorica);
        
        if(zObservado >= -zSignificancia && zObservado <= zSignificancia) 
        {
            return false; //Hay indicios, pero no se deduce nada
        }
        
        else return true; // Hay dependencia en los datos
    }

    public double getzObservado() {
        return zObservado;
    }

    public double getzSignificancia() {
        return zSignificancia;
    }
    
}
